home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / test / test_weakref.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  34KB  |  972 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import gc
  5. import sys
  6. import unittest
  7. import UserList
  8. import weakref
  9. from test import test_support
  10.  
  11. class C:
  12.     
  13.     def method(self):
  14.         pass
  15.  
  16.  
  17.  
  18. class Callable:
  19.     bar = None
  20.     
  21.     def __call__(self, x):
  22.         self.bar = x
  23.  
  24.  
  25.  
  26. def create_function():
  27.     
  28.     def f():
  29.         pass
  30.  
  31.     return f
  32.  
  33.  
  34. def create_bound_method():
  35.     return C().method
  36.  
  37.  
  38. def create_unbound_method():
  39.     return C.method
  40.  
  41.  
  42. class TestBase(unittest.TestCase):
  43.     
  44.     def setUp(self):
  45.         self.cbcalled = 0
  46.  
  47.     
  48.     def callback(self, ref):
  49.         self.cbcalled += 1
  50.  
  51.  
  52.  
  53. class ReferencesTestCase(TestBase):
  54.     
  55.     def test_basic_ref(self):
  56.         self.check_basic_ref(C)
  57.         self.check_basic_ref(create_function)
  58.         self.check_basic_ref(create_bound_method)
  59.         self.check_basic_ref(create_unbound_method)
  60.         o = C()
  61.         wr = weakref.ref(o)
  62.         `wr`
  63.         del o
  64.         `wr`
  65.  
  66.     
  67.     def test_basic_callback(self):
  68.         self.check_basic_callback(C)
  69.         self.check_basic_callback(create_function)
  70.         self.check_basic_callback(create_bound_method)
  71.         self.check_basic_callback(create_unbound_method)
  72.  
  73.     
  74.     def test_multiple_callbacks(self):
  75.         o = C()
  76.         ref1 = weakref.ref(o, self.callback)
  77.         ref2 = weakref.ref(o, self.callback)
  78.         del o
  79.         self.assert_(ref1() is None, 'expected reference to be invalidated')
  80.         self.assert_(ref2() is None, 'expected reference to be invalidated')
  81.         self.assert_(self.cbcalled == 2, 'callback not called the right number of times')
  82.  
  83.     
  84.     def test_multiple_selfref_callbacks(self):
  85.         
  86.         def callback(object, self = self):
  87.             self.ref()
  88.  
  89.         c = C()
  90.         self.ref = weakref.ref(c, callback)
  91.         ref1 = weakref.ref(c, callback)
  92.         del c
  93.  
  94.     
  95.     def test_proxy_ref(self):
  96.         o = C()
  97.         o.bar = 1
  98.         ref1 = weakref.proxy(o, self.callback)
  99.         ref2 = weakref.proxy(o, self.callback)
  100.         del o
  101.         
  102.         def check(proxy):
  103.             proxy.bar
  104.  
  105.         self.assertRaises(weakref.ReferenceError, check, ref1)
  106.         self.assertRaises(weakref.ReferenceError, check, ref2)
  107.         self.assertRaises(weakref.ReferenceError, bool, weakref.proxy(C()))
  108.         self.assert_(self.cbcalled == 2)
  109.  
  110.     
  111.     def check_basic_ref(self, factory):
  112.         o = factory()
  113.         ref = weakref.ref(o)
  114.         self.assert_(ref() is not None, 'weak reference to live object should be live')
  115.         o2 = ref()
  116.         self.assert_(o is o2, '<ref>() should return original object if live')
  117.  
  118.     
  119.     def check_basic_callback(self, factory):
  120.         self.cbcalled = 0
  121.         o = factory()
  122.         ref = weakref.ref(o, self.callback)
  123.         del o
  124.         self.assert_(self.cbcalled == 1, "callback did not properly set 'cbcalled'")
  125.         self.assert_(ref() is None, 'ref2 should be dead after deleting object reference')
  126.  
  127.     
  128.     def test_ref_reuse(self):
  129.         o = C()
  130.         ref1 = weakref.ref(o)
  131.         proxy = weakref.proxy(o)
  132.         ref2 = weakref.ref(o)
  133.         self.assert_(ref1 is ref2, 'reference object w/out callback should be re-used')
  134.         o = C()
  135.         proxy = weakref.proxy(o)
  136.         ref1 = weakref.ref(o)
  137.         ref2 = weakref.ref(o)
  138.         self.assert_(ref1 is ref2, 'reference object w/out callback should be re-used')
  139.         self.assert_(weakref.getweakrefcount(o) == 2, 'wrong weak ref count for object')
  140.         del proxy
  141.         self.assert_(weakref.getweakrefcount(o) == 1, 'wrong weak ref count for object after deleting proxy')
  142.  
  143.     
  144.     def test_proxy_reuse(self):
  145.         o = C()
  146.         proxy1 = weakref.proxy(o)
  147.         ref = weakref.ref(o)
  148.         proxy2 = weakref.proxy(o)
  149.         self.assert_(proxy1 is proxy2, 'proxy object w/out callback should have been re-used')
  150.  
  151.     
  152.     def test_basic_proxy(self):
  153.         o = C()
  154.         self.check_proxy(o, weakref.proxy(o))
  155.         L = UserList.UserList()
  156.         p = weakref.proxy(L)
  157.         self.failIf(p, 'proxy for empty UserList should be false')
  158.         p.append(12)
  159.         self.assertEqual(len(L), 1)
  160.         self.failUnless(p, 'proxy for non-empty UserList should be true')
  161.         p[:] = [
  162.             2,
  163.             3]
  164.         self.assertEqual(len(L), 2)
  165.         self.assertEqual(len(p), 2)
  166.         self.failUnless(3 in p, "proxy didn't support __contains__() properly")
  167.         p[1] = 5
  168.         self.assertEqual(L[1], 5)
  169.         self.assertEqual(p[1], 5)
  170.         L2 = UserList.UserList(L)
  171.         p2 = weakref.proxy(L2)
  172.         self.assertEqual(p, p2)
  173.         L3 = UserList.UserList(range(10))
  174.         p3 = weakref.proxy(L3)
  175.         self.assertEqual(L3[:], p3[:])
  176.         self.assertEqual(L3[5:], p3[5:])
  177.         self.assertEqual(L3[:5], p3[:5])
  178.         self.assertEqual(L3[2:5], p3[2:5])
  179.  
  180.     
  181.     def test_shared_ref_without_callback(self):
  182.         self.check_shared_without_callback(weakref.ref)
  183.  
  184.     
  185.     def test_shared_proxy_without_callback(self):
  186.         self.check_shared_without_callback(weakref.proxy)
  187.  
  188.     
  189.     def check_shared_without_callback(self, makeref):
  190.         o = Object(1)
  191.         p1 = makeref(o, None)
  192.         p2 = makeref(o, None)
  193.         self.assert_(p1 is p2, 'both callbacks were None in the C API')
  194.         del p1
  195.         del p2
  196.         p1 = makeref(o)
  197.         p2 = makeref(o, None)
  198.         self.assert_(p1 is p2, 'callbacks were NULL, None in the C API')
  199.         del p1
  200.         del p2
  201.         p1 = makeref(o)
  202.         p2 = makeref(o)
  203.         self.assert_(p1 is p2, 'both callbacks were NULL in the C API')
  204.         del p1
  205.         del p2
  206.         p1 = makeref(o, None)
  207.         p2 = makeref(o)
  208.         self.assert_(p1 is p2, 'callbacks were None, NULL in the C API')
  209.  
  210.     
  211.     def test_callable_proxy(self):
  212.         o = Callable()
  213.         ref1 = weakref.proxy(o)
  214.         self.check_proxy(o, ref1)
  215.         self.assert_(type(ref1) is weakref.CallableProxyType, 'proxy is not of callable type')
  216.         ref1('twinkies!')
  217.         self.assert_(o.bar == 'twinkies!', 'call through proxy not passed through to original')
  218.         ref1(x = 'Splat.')
  219.         self.assert_(o.bar == 'Splat.', 'call through proxy not passed through to original')
  220.         self.assertRaises(TypeError, ref1)
  221.         self.assertRaises(TypeError, ref1, 1, 2, 3)
  222.  
  223.     
  224.     def check_proxy(self, o, proxy):
  225.         o.foo = 1
  226.         self.assert_(proxy.foo == 1, 'proxy does not reflect attribute addition')
  227.         o.foo = 2
  228.         self.assert_(proxy.foo == 2, 'proxy does not reflect attribute modification')
  229.         del o.foo
  230.         self.assert_(not hasattr(proxy, 'foo'), 'proxy does not reflect attribute removal')
  231.         proxy.foo = 1
  232.         self.assert_(o.foo == 1, 'object does not reflect attribute addition via proxy')
  233.         proxy.foo = 2
  234.         self.assert_(o.foo == 2, 'object does not reflect attribute modification via proxy')
  235.         del proxy.foo
  236.         self.assert_(not hasattr(o, 'foo'), 'object does not reflect attribute removal via proxy')
  237.  
  238.     
  239.     def test_proxy_deletion(self):
  240.         
  241.         class Foo:
  242.             result = None
  243.             
  244.             def __delitem__(self, accessor):
  245.                 self.result = accessor
  246.  
  247.  
  248.         g = Foo()
  249.         f = weakref.proxy(g)
  250.         del f[0]
  251.         self.assertEqual(f.result, 0)
  252.  
  253.     
  254.     def test_proxy_bool(self):
  255.         
  256.         class List(list):
  257.             pass
  258.  
  259.         lyst = List()
  260.         self.assertEqual(bool(weakref.proxy(lyst)), bool(lyst))
  261.  
  262.     
  263.     def test_getweakrefcount(self):
  264.         o = C()
  265.         ref1 = weakref.ref(o)
  266.         ref2 = weakref.ref(o, self.callback)
  267.         self.assert_(weakref.getweakrefcount(o) == 2, 'got wrong number of weak reference objects')
  268.         proxy1 = weakref.proxy(o)
  269.         proxy2 = weakref.proxy(o, self.callback)
  270.         self.assert_(weakref.getweakrefcount(o) == 4, 'got wrong number of weak reference objects')
  271.         del ref1
  272.         del ref2
  273.         del proxy1
  274.         del proxy2
  275.         self.assert_(weakref.getweakrefcount(o) == 0, 'weak reference objects not unlinked from referent when discarded.')
  276.         self.assert_(weakref.getweakrefcount(1) == 0, 'got wrong number of weak reference objects for int')
  277.  
  278.     
  279.     def test_getweakrefs(self):
  280.         o = C()
  281.         ref1 = weakref.ref(o, self.callback)
  282.         ref2 = weakref.ref(o, self.callback)
  283.         del ref1
  284.         self.assert_(weakref.getweakrefs(o) == [
  285.             ref2], 'list of refs does not match')
  286.         o = C()
  287.         ref1 = weakref.ref(o, self.callback)
  288.         ref2 = weakref.ref(o, self.callback)
  289.         del ref2
  290.         self.assert_(weakref.getweakrefs(o) == [
  291.             ref1], 'list of refs does not match')
  292.         del ref1
  293.         self.assert_(weakref.getweakrefs(o) == [], 'list of refs not cleared')
  294.         self.assert_(weakref.getweakrefs(1) == [], 'list of refs does not match for int')
  295.  
  296.     
  297.     def test_newstyle_number_ops(self):
  298.         
  299.         class F(float):
  300.             pass
  301.  
  302.         f = F(2.0)
  303.         p = weakref.proxy(f)
  304.         self.assert_(p + 1.0 == 3.0)
  305.         self.assert_(1.0 + p == 3.0)
  306.  
  307.     
  308.     def test_callbacks_protected(self):
  309.         
  310.         class BogusError(Exception):
  311.             pass
  312.  
  313.         data = { }
  314.         
  315.         def remove(k):
  316.             del data[k]
  317.  
  318.         
  319.         def encapsulate():
  320.             
  321.             f = lambda : ()
  322.             data[weakref.ref(f, remove)] = None
  323.             raise BogusError
  324.  
  325.         
  326.         try:
  327.             encapsulate()
  328.         except BogusError:
  329.             pass
  330.  
  331.         self.fail('exception not properly restored')
  332.         
  333.         try:
  334.             encapsulate()
  335.         except BogusError:
  336.             pass
  337.  
  338.         self.fail('exception not properly restored')
  339.  
  340.     
  341.     def test_sf_bug_840829(self):
  342.         import gc
  343.         
  344.         class C(object):
  345.             pass
  346.  
  347.         c = C()
  348.         wr = weakref.ref(c, (lambda ignore: gc.collect()))
  349.         del c
  350.         del wr
  351.         c1 = C()
  352.         c1.i = C()
  353.         wr = weakref.ref(c1.i, (lambda ignore: gc.collect()))
  354.         c2 = C()
  355.         c2.c1 = c1
  356.         del c1
  357.         del c2
  358.  
  359.     
  360.     def test_callback_in_cycle_1(self):
  361.         import gc
  362.         
  363.         class J(object):
  364.             pass
  365.  
  366.         
  367.         class II(object):
  368.             
  369.             def acallback(self, ignore):
  370.                 self.J
  371.  
  372.  
  373.         I = II()
  374.         I.J = J
  375.         I.wr = weakref.ref(J, I.acallback)
  376.         del I
  377.         del J
  378.         del II
  379.         gc.collect()
  380.  
  381.     
  382.     def test_callback_in_cycle_2(self):
  383.         import gc
  384.         
  385.         class J(object):
  386.             pass
  387.  
  388.         
  389.         class II:
  390.             
  391.             def acallback(self, ignore):
  392.                 self.J
  393.  
  394.  
  395.         I = II()
  396.         I.J = J
  397.         I.wr = weakref.ref(J, I.acallback)
  398.         del I
  399.         del J
  400.         del II
  401.         gc.collect()
  402.  
  403.     
  404.     def test_callback_in_cycle_3(self):
  405.         import gc
  406.         
  407.         class C:
  408.             
  409.             def cb(self, ignore):
  410.                 self.me
  411.                 self.c1
  412.                 self.wr
  413.  
  414.  
  415.         c1 = C()
  416.         c2 = C()
  417.         c2.me = c2
  418.         c2.c1 = c1
  419.         c2.wr = weakref.ref(c1, c2.cb)
  420.         del c1
  421.         del c2
  422.         gc.collect()
  423.  
  424.     
  425.     def test_callback_in_cycle_4(self):
  426.         import gc
  427.         
  428.         class C(object):
  429.             
  430.             def cb(self, ignore):
  431.                 self.me
  432.                 self.c1
  433.                 self.wr
  434.  
  435.  
  436.         
  437.         class D:
  438.             pass
  439.  
  440.         c1 = D()
  441.         c2 = C()
  442.         c2.me = c2
  443.         c2.c1 = c1
  444.         c2.wr = weakref.ref(c1, c2.cb)
  445.         del c1
  446.         del c2
  447.         del C
  448.         del D
  449.         gc.collect()
  450.  
  451.     
  452.     def test_callback_in_cycle_resurrection(self):
  453.         import gc
  454.         alist = []
  455.         
  456.         class C(object):
  457.             
  458.             def __init__(self, value):
  459.                 self.attribute = value
  460.  
  461.             
  462.             def acallback(self, ignore):
  463.                 alist.append(self.c)
  464.  
  465.  
  466.         c1 = C(1)
  467.         c2 = C(2)
  468.         c1.c = c2
  469.         c2.c = c1
  470.         c1.wr = weakref.ref(c2, c1.acallback)
  471.         c2.wr = weakref.ref(c1, c2.acallback)
  472.         
  473.         def C_went_away(ignore):
  474.             alist.append('C went away')
  475.  
  476.         wr = weakref.ref(C, C_went_away)
  477.         del c1
  478.         del c2
  479.         del C
  480.         self.assertEqual(alist, [])
  481.         gc.collect()
  482.         self.assertEqual(alist, [
  483.             'C went away'])
  484.         self.assertEqual(wr(), None)
  485.         del alist[:]
  486.         gc.collect()
  487.         self.assertEqual(alist, [])
  488.  
  489.     
  490.     def test_callbacks_on_callback(self):
  491.         import gc
  492.         alist = []
  493.         
  494.         def safe_callback(ignore):
  495.             alist.append('safe_callback called')
  496.  
  497.         
  498.         class C(object):
  499.             
  500.             def cb(self, ignore):
  501.                 alist.append('cb called')
  502.  
  503.  
  504.         c = C()
  505.         d = C()
  506.         c.other = d
  507.         d.other = c
  508.         callback = c.cb
  509.         c.wr = weakref.ref(d, callback)
  510.         d.wr = weakref.ref(callback, d.cb)
  511.         external_wr = weakref.ref(callback, safe_callback)
  512.         self.assert_(external_wr() is callback)
  513.         del callback
  514.         del c
  515.         del d
  516.         del C
  517.         self.assertEqual(alist, [])
  518.         gc.collect()
  519.         self.assertEqual(alist, [
  520.             'safe_callback called'])
  521.         self.assertEqual(external_wr(), None)
  522.         del alist[:]
  523.         gc.collect()
  524.         self.assertEqual(alist, [])
  525.  
  526.     
  527.     def test_gc_during_ref_creation(self):
  528.         self.check_gc_during_creation(weakref.ref)
  529.  
  530.     
  531.     def test_gc_during_proxy_creation(self):
  532.         self.check_gc_during_creation(weakref.proxy)
  533.  
  534.     
  535.     def check_gc_during_creation(self, makeref):
  536.         thresholds = gc.get_threshold()
  537.         gc.set_threshold(1, 1, 1)
  538.         gc.collect()
  539.         
  540.         class A:
  541.             pass
  542.  
  543.         
  544.         def callback(*args):
  545.             pass
  546.  
  547.         referenced = A()
  548.         a = A()
  549.         a.a = a
  550.         a.wr = makeref(referenced)
  551.         
  552.         try:
  553.             a = A()
  554.             weakref.ref(referenced, callback)
  555.         finally:
  556.             gc.set_threshold(*thresholds)
  557.  
  558.  
  559.  
  560.  
  561. class SubclassableWeakrefTestCase(unittest.TestCase):
  562.     
  563.     def test_subclass_refs(self):
  564.         
  565.         class MyRef(weakref.ref):
  566.             
  567.             def __init__(self, ob, callback = None, value = 42):
  568.                 self.value = value
  569.                 super(MyRef, self).__init__(ob, callback)
  570.  
  571.             
  572.             def __call__(self):
  573.                 self.called = True
  574.                 return super(MyRef, self).__call__()
  575.  
  576.  
  577.         o = Object('foo')
  578.         mr = MyRef(o, value = 24)
  579.         self.assert_(mr() is o)
  580.         self.assert_(mr.called)
  581.         self.assertEqual(mr.value, 24)
  582.         del o
  583.         self.assert_(mr() is None)
  584.         self.assert_(mr.called)
  585.  
  586.     
  587.     def test_subclass_refs_dont_replace_standard_refs(self):
  588.         
  589.         class MyRef(weakref.ref):
  590.             pass
  591.  
  592.         o = Object(42)
  593.         r1 = MyRef(o)
  594.         r2 = weakref.ref(o)
  595.         self.assert_(r1 is not r2)
  596.         self.assertEqual(weakref.getweakrefs(o), [
  597.             r2,
  598.             r1])
  599.         self.assertEqual(weakref.getweakrefcount(o), 2)
  600.         r3 = MyRef(o)
  601.         self.assertEqual(weakref.getweakrefcount(o), 3)
  602.         refs = weakref.getweakrefs(o)
  603.         self.assertEqual(len(refs), 3)
  604.         self.assert_(r2 is refs[0])
  605.         self.assert_(r1 in refs[1:])
  606.         self.assert_(r3 in refs[1:])
  607.  
  608.     
  609.     def test_subclass_refs_dont_conflate_callbacks(self):
  610.         
  611.         class MyRef(weakref.ref):
  612.             pass
  613.  
  614.         o = Object(42)
  615.         r1 = MyRef(o, id)
  616.         r2 = MyRef(o, str)
  617.         self.assert_(r1 is not r2)
  618.         refs = weakref.getweakrefs(o)
  619.         self.assert_(r1 in refs)
  620.         self.assert_(r2 in refs)
  621.  
  622.     
  623.     def test_subclass_refs_with_slots(self):
  624.         
  625.         class MyRef(weakref.ref):
  626.             __slots__ = ('slot1', 'slot2')
  627.             
  628.             def __new__(type, ob, callback, slot1, slot2):
  629.                 return weakref.ref.__new__(type, ob, callback)
  630.  
  631.             
  632.             def __init__(self, ob, callback, slot1, slot2):
  633.                 self.slot1 = slot1
  634.                 self.slot2 = slot2
  635.  
  636.             
  637.             def meth(self):
  638.                 return self.slot1 + self.slot2
  639.  
  640.  
  641.         o = Object(42)
  642.         r = MyRef(o, None, 'abc', 'def')
  643.         self.assertEqual(r.slot1, 'abc')
  644.         self.assertEqual(r.slot2, 'def')
  645.         self.assertEqual(r.meth(), 'abcdef')
  646.         self.failIf(hasattr(r, '__dict__'))
  647.  
  648.  
  649.  
  650. class Object:
  651.     
  652.     def __init__(self, arg):
  653.         self.arg = arg
  654.  
  655.     
  656.     def __repr__(self):
  657.         return '<Object %r>' % self.arg
  658.  
  659.  
  660.  
  661. class MappingTestCase(TestBase):
  662.     COUNT = 10
  663.     
  664.     def test_weak_values(self):
  665.         (dict, objects) = self.make_weak_valued_dict()
  666.         for o in objects:
  667.             self.assert_(weakref.getweakrefcount(o) == 1, 'wrong number of weak references to %r!' % o)
  668.             self.assert_(o is dict[o.arg], 'wrong object returned by weak dict!')
  669.         
  670.         items1 = dict.items()
  671.         items2 = dict.copy().items()
  672.         items1.sort()
  673.         items2.sort()
  674.         self.assert_(items1 == items2, 'cloning of weak-valued dictionary did not work!')
  675.         del items1
  676.         del items2
  677.         self.assert_(len(dict) == self.COUNT)
  678.         del objects[0]
  679.         self.assert_(len(dict) == self.COUNT - 1, 'deleting object did not cause dictionary update')
  680.         del objects
  681.         del o
  682.         self.assert_(len(dict) == 0, 'deleting the values did not clear the dictionary')
  683.         dict = weakref.WeakValueDictionary()
  684.         self.assertRaises(KeyError, dict.__getitem__, 1)
  685.         dict[2] = C()
  686.         self.assertRaises(KeyError, dict.__getitem__, 2)
  687.  
  688.     
  689.     def test_weak_keys(self):
  690.         (dict, objects) = self.make_weak_keyed_dict()
  691.         for o in objects:
  692.             self.assert_(weakref.getweakrefcount(o) == 1, 'wrong number of weak references to %r!' % o)
  693.             self.assert_(o.arg is dict[o], 'wrong object returned by weak dict!')
  694.         
  695.         items1 = dict.items()
  696.         items2 = dict.copy().items()
  697.         self.assert_(set(items1) == set(items2), 'cloning of weak-keyed dictionary did not work!')
  698.         del items1
  699.         del items2
  700.         self.assert_(len(dict) == self.COUNT)
  701.         del objects[0]
  702.         self.assert_(len(dict) == self.COUNT - 1, 'deleting object did not cause dictionary update')
  703.         del objects
  704.         del o
  705.         self.assert_(len(dict) == 0, 'deleting the keys did not clear the dictionary')
  706.         o = Object(42)
  707.         dict[o] = 'What is the meaning of the universe?'
  708.         self.assert_(dict.has_key(o))
  709.         self.assert_(not dict.has_key(34))
  710.  
  711.     
  712.     def test_weak_keyed_iters(self):
  713.         (dict, objects) = self.make_weak_keyed_dict()
  714.         self.check_iters(dict)
  715.  
  716.     
  717.     def test_weak_valued_iters(self):
  718.         (dict, objects) = self.make_weak_valued_dict()
  719.         self.check_iters(dict)
  720.  
  721.     
  722.     def check_iters(self, dict):
  723.         items = dict.items()
  724.         for item in dict.iteritems():
  725.             items.remove(item)
  726.         
  727.         self.assert_(len(items) == 0, 'iteritems() did not touch all items')
  728.         keys = dict.keys()
  729.         for k in dict:
  730.             keys.remove(k)
  731.         
  732.         self.assert_(len(keys) == 0, '__iter__() did not touch all keys')
  733.         keys = dict.keys()
  734.         for k in dict.iterkeys():
  735.             keys.remove(k)
  736.         
  737.         self.assert_(len(keys) == 0, 'iterkeys() did not touch all keys')
  738.         values = dict.values()
  739.         for v in dict.itervalues():
  740.             values.remove(v)
  741.         
  742.         self.assert_(len(values) == 0, 'itervalues() did not touch all values')
  743.  
  744.     
  745.     def test_make_weak_keyed_dict_from_dict(self):
  746.         o = Object(3)
  747.         dict = weakref.WeakKeyDictionary({
  748.             o: 364 })
  749.         self.assert_(dict[o] == 364)
  750.  
  751.     
  752.     def test_make_weak_keyed_dict_from_weak_keyed_dict(self):
  753.         o = Object(3)
  754.         dict = weakref.WeakKeyDictionary({
  755.             o: 364 })
  756.         dict2 = weakref.WeakKeyDictionary(dict)
  757.         self.assert_(dict[o] == 364)
  758.  
  759.     
  760.     def make_weak_keyed_dict(self):
  761.         dict = weakref.WeakKeyDictionary()
  762.         objects = map(Object, range(self.COUNT))
  763.         for o in objects:
  764.             dict[o] = o.arg
  765.         
  766.         return (dict, objects)
  767.  
  768.     
  769.     def make_weak_valued_dict(self):
  770.         dict = weakref.WeakValueDictionary()
  771.         objects = map(Object, range(self.COUNT))
  772.         for o in objects:
  773.             dict[o.arg] = o
  774.         
  775.         return (dict, objects)
  776.  
  777.     
  778.     def check_popitem(self, klass, key1, value1, key2, value2):
  779.         weakdict = klass()
  780.         weakdict[key1] = value1
  781.         weakdict[key2] = value2
  782.         self.assert_(len(weakdict) == 2)
  783.         (k, v) = weakdict.popitem()
  784.         self.assert_(len(weakdict) == 1)
  785.         if k is key1:
  786.             self.assert_(v is value1)
  787.         else:
  788.             self.assert_(v is value2)
  789.         (k, v) = weakdict.popitem()
  790.         self.assert_(len(weakdict) == 0)
  791.         if k is key1:
  792.             self.assert_(v is value1)
  793.         else:
  794.             self.assert_(v is value2)
  795.  
  796.     
  797.     def test_weak_valued_dict_popitem(self):
  798.         self.check_popitem(weakref.WeakValueDictionary, 'key1', C(), 'key2', C())
  799.  
  800.     
  801.     def test_weak_keyed_dict_popitem(self):
  802.         self.check_popitem(weakref.WeakKeyDictionary, C(), 'value 1', C(), 'value 2')
  803.  
  804.     
  805.     def check_setdefault(self, klass, key, value1, value2):
  806.         self.assert_(value1 is not value2, 'invalid test -- value parameters must be distinct objects')
  807.         weakdict = klass()
  808.         o = weakdict.setdefault(key, value1)
  809.         self.assert_(o is value1)
  810.         self.assert_(weakdict.has_key(key))
  811.         self.assert_(weakdict.get(key) is value1)
  812.         self.assert_(weakdict[key] is value1)
  813.         o = weakdict.setdefault(key, value2)
  814.         self.assert_(o is value1)
  815.         self.assert_(weakdict.has_key(key))
  816.         self.assert_(weakdict.get(key) is value1)
  817.         self.assert_(weakdict[key] is value1)
  818.  
  819.     
  820.     def test_weak_valued_dict_setdefault(self):
  821.         self.check_setdefault(weakref.WeakValueDictionary, 'key', C(), C())
  822.  
  823.     
  824.     def test_weak_keyed_dict_setdefault(self):
  825.         self.check_setdefault(weakref.WeakKeyDictionary, C(), 'value 1', 'value 2')
  826.  
  827.     
  828.     def check_update(self, klass, dict):
  829.         weakdict = klass()
  830.         weakdict.update(dict)
  831.         self.assert_(len(weakdict) == len(dict))
  832.         for k in weakdict.keys():
  833.             self.assert_(dict.has_key(k), 'mysterious new key appeared in weak dict')
  834.             v = dict.get(k)
  835.             self.assert_(v is weakdict[k])
  836.             self.assert_(v is weakdict.get(k))
  837.         
  838.         for k in dict.keys():
  839.             self.assert_(weakdict.has_key(k), 'original key disappeared in weak dict')
  840.             v = dict[k]
  841.             self.assert_(v is weakdict[k])
  842.             self.assert_(v is weakdict.get(k))
  843.         
  844.  
  845.     
  846.     def test_weak_valued_dict_update(self):
  847.         self.check_update(weakref.WeakValueDictionary, {
  848.             1: C(),
  849.             'a': C(),
  850.             C(): C() })
  851.  
  852.     
  853.     def test_weak_keyed_dict_update(self):
  854.         self.check_update(weakref.WeakKeyDictionary, {
  855.             C(): 1,
  856.             C(): 2,
  857.             C(): 3 })
  858.  
  859.     
  860.     def test_weak_keyed_delitem(self):
  861.         d = weakref.WeakKeyDictionary()
  862.         o1 = Object('1')
  863.         o2 = Object('2')
  864.         d[o1] = 'something'
  865.         d[o2] = 'something'
  866.         self.assert_(len(d) == 2)
  867.         del d[o1]
  868.         self.assert_(len(d) == 1)
  869.         self.assert_(d.keys() == [
  870.             o2])
  871.  
  872.     
  873.     def test_weak_valued_delitem(self):
  874.         d = weakref.WeakValueDictionary()
  875.         o1 = Object('1')
  876.         o2 = Object('2')
  877.         d['something'] = o1
  878.         d['something else'] = o2
  879.         self.assert_(len(d) == 2)
  880.         del d['something']
  881.         self.assert_(len(d) == 1)
  882.         self.assert_(d.items() == [
  883.             ('something else', o2)])
  884.  
  885.     
  886.     def test_weak_keyed_bad_delitem(self):
  887.         d = weakref.WeakKeyDictionary()
  888.         o = Object('1')
  889.         self.assertRaises(KeyError, d.__delitem__, o)
  890.         self.assertRaises(KeyError, d.__getitem__, o)
  891.         self.assertRaises(TypeError, d.__delitem__, 13)
  892.         self.assertRaises(TypeError, d.__getitem__, 13)
  893.         self.assertRaises(TypeError, d.__setitem__, 13, 13)
  894.  
  895.     
  896.     def test_weak_keyed_cascading_deletes(self):
  897.         d = weakref.WeakKeyDictionary()
  898.         mutate = False
  899.         
  900.         class C(object):
  901.             
  902.             def __init__(self, i):
  903.                 self.value = i
  904.  
  905.             
  906.             def __hash__(self):
  907.                 return hash(self.value)
  908.  
  909.             
  910.             def __eq__(self, other):
  911.                 if mutate:
  912.                     del objs[-1]
  913.                 
  914.                 return self.value == other.value
  915.  
  916.  
  917.         objs = [ C(i) for i in range(4) ]
  918.         for o in objs:
  919.             d[o] = o.value
  920.         
  921.         del o
  922.         objs = d.keys()
  923.         objs.reverse()
  924.         mutate = True
  925.         count = 0
  926.         for o in objs:
  927.             count += 1
  928.             del d[o]
  929.         
  930.         self.assertEqual(len(d), 0)
  931.         self.assertEqual(count, 2)
  932.  
  933.  
  934. from test import mapping_tests
  935.  
  936. class WeakValueDictionaryTestCase(mapping_tests.BasicTestMappingProtocol):
  937.     '''Check that WeakValueDictionary conforms to the mapping protocol'''
  938.     __ref = {
  939.         'key1': Object(1),
  940.         'key2': Object(2),
  941.         'key3': Object(3) }
  942.     type2test = weakref.WeakValueDictionary
  943.     
  944.     def _reference(self):
  945.         return self._WeakValueDictionaryTestCase__ref.copy()
  946.  
  947.  
  948.  
  949. class WeakKeyDictionaryTestCase(mapping_tests.BasicTestMappingProtocol):
  950.     '''Check that WeakKeyDictionary conforms to the mapping protocol'''
  951.     __ref = {
  952.         Object('key1'): 1,
  953.         Object('key2'): 2,
  954.         Object('key3'): 3 }
  955.     type2test = weakref.WeakKeyDictionary
  956.     
  957.     def _reference(self):
  958.         return self._WeakKeyDictionaryTestCase__ref.copy()
  959.  
  960.  
  961. libreftest = ' Doctest for examples in the library reference: libweakref.tex\n\n>>> import weakref\n>>> class Dict(dict):\n...     pass\n...\n>>> obj = Dict(red=1, green=2, blue=3)   # this object is weak referencable\n>>> r = weakref.ref(obj)\n>>> print r()\n{\'blue\': 3, \'green\': 2, \'red\': 1}\n\n>>> import weakref\n>>> class Object:\n...     pass\n...\n>>> o = Object()\n>>> r = weakref.ref(o)\n>>> o2 = r()\n>>> o is o2\nTrue\n>>> del o, o2\n>>> print r()\nNone\n\n>>> import weakref\n>>> class ExtendedRef(weakref.ref):\n...     def __init__(self, ob, callback=None, **annotations):\n...         super(ExtendedRef, self).__init__(ob, callback)\n...         self.__counter = 0\n...         for k, v in annotations.iteritems():\n...             setattr(self, k, v)\n...     def __call__(self):\n...         \'\'\'Return a pair containing the referent and the number of\n...         times the reference has been called.\n...         \'\'\'\n...         ob = super(ExtendedRef, self).__call__()\n...         if ob is not None:\n...             self.__counter += 1\n...             ob = (ob, self.__counter)\n...         return ob\n...\n>>> class A:   # not in docs from here, just testing the ExtendedRef\n...     pass\n...\n>>> a = A()\n>>> r = ExtendedRef(a, foo=1, bar="baz")\n>>> r.foo\n1\n>>> r.bar\n\'baz\'\n>>> r()[1]\n1\n>>> r()[1]\n2\n>>> r()[0] is a\nTrue\n\n\n>>> import weakref\n>>> _id2obj_dict = weakref.WeakValueDictionary()\n>>> def remember(obj):\n...     oid = id(obj)\n...     _id2obj_dict[oid] = obj\n...     return oid\n...\n>>> def id2obj(oid):\n...     return _id2obj_dict[oid]\n...\n>>> a = A()             # from here, just testing\n>>> a_id = remember(a)\n>>> id2obj(a_id) is a\nTrue\n>>> del a\n>>> try:\n...     id2obj(a_id)\n... except KeyError:\n...     print \'OK\'\n... else:\n...     print \'WeakValueDictionary error\'\nOK\n\n'
  962. __test__ = {
  963.     'libreftest': libreftest }
  964.  
  965. def test_main():
  966.     test_support.run_unittest(ReferencesTestCase, MappingTestCase, WeakValueDictionaryTestCase, WeakKeyDictionaryTestCase)
  967.     test_support.run_doctest(sys.modules[__name__])
  968.  
  969. if __name__ == '__main__':
  970.     test_main()
  971.  
  972.